StatefulSet Controller 是穩定又有序的, 它會記錄有狀態應用的狀態, 嚴格的控制循環監控Pod的實際狀態與期望狀態是否相同, 發生不相同時會依照本身紀錄的狀態屬性做復原。
由StatefulSet Controller擴展出來的Pod名稱是有序的, 具有唯一網路識別符與持久化儲存裝置, 會有序地擴展, 有序地刪除, 適合應用在需要保持狀態或需要唯一網路識別符的服務。
StatefulSet 特性
StatefulSet 組成
StatefulSet Controller 會為每個VolumeClaimTemplate創建一個專用的PV, 透過指定的StorageClass關聯PVC和PV, 未指定的就使用預設StorageClass, 刪除Pod時並不會刪除PV, 所以PV數據可復用。
StatefulSet 支援動態擴縮容操作, 擴容時會按照順序增加更多的Pod, 刪除時則會反序刪除Pod直到符合期望為止, 擴容或刪除都需要等前一個Pod完成動作才會進行下一個, 所以過程中如果有一個Pod發生錯誤尚未執行完流程時, StatefulSet 也會停下來等錯誤排除才會進行下一個。
spec 必填字段serviceName
, template
;spec.selector.matchLabels
必須和 spec.template.metadata.labels
相同。
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
labels:
app: myapp-svc
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: myapp-svc
replicas: 1
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- args:
- -c
- /nsqd --tcp-address=0.0.0.0:4188 --lookupd-tcp-address=nsqlookupd:4160 --data-path=/data
--broadcast-address=$(hostname -f)
command:
- /bin/sh
name: myapp
image: nsqio/nsq:v1.2.0
imagePullPolicy: Always
ports:
- containerPort: 4188
name: tcp
protocol: TCP
- containerPort: 4151
name: http
protocol: TCP
volumeMounts:
- mountPath: /data
name: data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 2Gi
volumeMode: Filesystem
滾動更新StatefulSet預設的更新方是, 它會以反序的方式從最大的索引編號進行更新, 等更新就續後才會啟動下一個資源(即索引號碼-1), 對於具有主從複製類的cluster來說, 可以確保主節點作用的Pod會是最後一個更新的。
spec.updateStrategy.rollingUpdate.partition
字段的值設定為Pod的副本數量, 其分區編號就會是Pod索引號+1, 表示所有的Pod都不會處於可直接更新的分區內, 之後的更新操作都不會直接執行更新, 會一直等到用戶降低分區編號到現有的Pod索引範圍內。StatefulSet Controller管理Pod的策略除了OrderedReady(升序創建, 降序刪除), 也支援並行的創建跟刪除, 要完成並行操作只需要將spec.podManagementPolicy
設定為Parallel
即可。
Statefulset的刪除方式和其他Pod Controller 一樣, 刪除時預設會把汗StatefulSet相關的Pod資源都刪掉, 如果要只刪除statefulSet本身可加上--cascade=false
即可。
昨天喝了兩杯, 覺得可以繼續走完剩下的10天了